package com.kgc.personcommon.util;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.security.Key;
import java.util.*;
//
///**
// * JWT 工具类：生成、解析、校验 Token
// */
//
//@Component
//public class JwtUtil {
//
//    private Logger logger = LoggerFactory.getLogger(getClass());
//
//    //签名密钥
//    @Value("${jwt.secret}")
//    private String secret;
//
//    //Token 有效期
//    @Value("${jwt.expiration}")
//    private long expiration;
//
//    //用于签名与解析的 Key 对象
//    private Key key;
//
////    // 构造函数注入配置
////    public JwtUtil(String secret, long expiration) {
////        this.secret = secret;
////        this.expiration = expiration;
////        logger.info("JwtUtil 初始化, secret: {}, expiration: {}",
////                secret.substring(0, 10) + "...");
////    }
//
//    //将 secret 字符串转换为 HMAC-SHA 算法所需的 Key 对象
//    @PostConstruct
//    public void init() {
//        // 将 secret 转为 Key
//        this.key = Keys.hmacShaKeyFor(secret.getBytes());
//    }
//
//    /**
//     * 生成 JWT
//     * @param username     用户名
//     * @param roles  权限列表（如 ["ROLE_USER","/api/user"] 等）
//     * @return 生成的 Token 字符串
//     */
//    public String generateToken(String username, List<String> roles) {
//        //创建 claims（声明），将权限列表放入声明中
//        Map<String, Object> claims = new HashMap<>();
//        claims.put("roles", roles);
//        Date now = new Date();
//        Date exp = new Date(now.getTime() + expiration);
//        return Jwts.builder()
//                //设置自定义声明
//                .setClaims(claims)
//                //设置主题
//                .setSubject(username)
//                //设置颁发时间
//                .setIssuedAt(now)
//                //设置过期时间
//                .setExpiration(exp)
//                //使用 HS512 算法和 key 签名
//                .signWith(key, SignatureAlgorithm.HS512)
//                //生成最终的 Token 字符串
//                .compact();
//    }
//
//    public String generateRefreshToken(String username, List<String> roles) {
//        Map<String, Object> claims = new HashMap<>();
//        claims.put("roles", roles);
//        Date now = new Date();
//        // refreshToken 有效期是原来的 2 倍
//        Date exp = new Date(now.getTime() + expiration * 2);
//        return Jwts.builder()
//                .setClaims(claims)
//                .setSubject(username)
//                .setIssuedAt(now)
//                .setExpiration(exp)
//                .signWith(key, SignatureAlgorithm.HS512)
//                .compact();
//    }
//
//
//    /**
//     * 从 Token 中获取用户名（subject）
//     */
//    public String getUsernameFromToken(String token) {
//        //转换token，并提取用户名
//        return parseClaims(token).getSubject();
//    }
//
//    /**
//     * 从 Token 中获取权限列表
//     */
//    //抑制类型转换警告
//    @SuppressWarnings("unchecked")
//    // 返回权限路径列表
//    public List<String> getAuthFromToken(String token) {
//        Object auth = parseClaims(token).get("roles");
//        if (auth instanceof List) {
//            return (List<String>) auth;
//        }
//        return Collections.emptyList();
//    }
//
//    /**
//     * 校验 Token 是否有效（签名 & 未过期）
//     */
//    public boolean validateToken(String token) {
//        try {
//            //解析 Token 获取 Claims
//            Claims claims = parseClaims(token);
//            //检查过期时间是否早于当前时间（new Date()）
//            return !claims.getExpiration().before(new Date());
//        } catch (JwtException | IllegalArgumentException e) {
//            return false;
//        }
//    }
//
//    /**
//     * 获取 Token 颁发时间
//     */
//    public Date getIssuedAtDate(String token) {
//        return parseClaims(token).getIssuedAt();
//    }
//
//    /**
//     * 获取 Token 到期时间
//     */
//    public Date getExpirationDate(String token) {
//        return parseClaims(token).getExpiration();
//    }
//
//    /**
//     * 判断是否可刷新（在过期前）
//     */
//    public boolean canTokenBeRefreshed(String token) {
//        return !parseClaims(token).getExpiration().before(new Date());
//    }
//
//    /**
//     * 刷新 Token（更新发行时间与到期时间）
//     */
//    public String refreshToken(String token) {
//        //解析旧 Token 获取 Claims
//        Claims claims = parseClaims(token);
//        Date now = new Date();
//        Date exp = new Date(now.getTime() + expiration);
//        //更新颁发时间（now）和过期时间（now + expiration）
//        claims.setIssuedAt(now);
//        claims.setExpiration(exp);
//        //使用更新后的 Claims 生成新 Token
//        return Jwts.builder()
//                .setClaims(claims)
//                .signWith(key, SignatureAlgorithm.HS512)
//                .compact();
//    }
//
//    /**
//     * 解析并返回 Claims（内部使用）
//     */
//    private Claims parseClaims(String token) {
//        //创建解析器
//        return Jwts.parserBuilder()
//                //设置签名密钥（key）以验证 Token
//                .setSigningKey(key)
//                .build()
//                .parseClaimsJws(token)
//                .getBody();
//    }
//
//    public String getSecret() {
//        return secret;
//    }
//
//    public void setSecret(String secret) {
//        this.secret = secret;
//    }
//
//    public long getExpiration() {
//        return expiration;
//    }
//
//    public void setExpiration(long expiration) {
//        this.expiration = expiration;
//    }
//}
@Component
public class JwtUtil {

    @Value("${jwt.secret}")
    private String secret;

    @Value("${jwt.expiration}")
    private long expiration;

    public String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, username, expiration);
    }

    public String generateRefreshToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, username, expiration * 2);
    }

    private String createToken(Map<String, Object> claims, String subject, long expireMs) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expireMs))
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }

    public boolean validateToken(String token) {
        try {
            getAllClaimsFromToken(token); // 若有异常则说明非法
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public String getUsernameFromToken(String token) {
        return getAllClaimsFromToken(token).getSubject();
    }

    public Date getExpirationDate(String token) {
        return getAllClaimsFromToken(token).getExpiration();
    }

    private Claims getAllClaimsFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
    }

    public long getExpiration() {
        return expiration;
    }
}
